package inputOutput;

import java.io.*;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.*;

import config.Config;
import ecole.infrastructure.Batiment;
import ecole.infrastructure.Salle;
import ecole.infrastructure.SalleAmphi;
import ecole.infrastructure.SalleCours;
import ecole.infrastructure.SalleReunion;
import ecole.infrastructure.SalleTd;
import ecole.infrastructure.SalleTpFixe;
import ecole.infrastructure.SalleTpPortable;
import ecole.organisation.Ecole;
import ecole.organisation.Enseignement;
import ecole.organisation.Groupe;
import ecole.organisation.Seance;
import ecole.utilisateur.Professeur;

import reservation.Reservation;

/**
 * Cette classe permet de sérialiser la liste de reservation
 * 
 * @author Fauconnier Simon
 */
public class SerialisationTexte extends Serialisation {

	private String pathResTxt = Config.PATH_RES_TXT;

	public SerialisationTexte() {
		super();
	}

	/**
	 * Lance la sauvegarde de la liste de réservation. On écrit les données des
	 * listes dans deux fichiers textes. Sur chaque ligne des fichiers, on écrit
	 * uniquement les informations permettant de reconstituer l'objet.
	 * Chaecoleque information est séparée par le séparateur '#'.
	 * 
	 * @return true si la sauvegarde a réussi, false sinon
	 * @throws IOException
	 */

	public void sauvegarder(List<Reservation> listeRes) throws IOException {
		PrintWriter writeReservation = new PrintWriter(new FileWriter(
				pathResTxt));

		if (writeReservation.checkError()) {
			System.out.println("erreur");
		} else {

			// On créé des String où à chaque ligne est écrit uniquement les
			// informations permettant de reconstituer l'objet.
			// Chaque information est séparée par le séparateur '#'.
			StringBuffer sReservation = new StringBuffer("");

			String key = "";

			Iterator i = listeRes.iterator();
			while (i.hasNext()) {
				Reservation res = (Reservation) i.next();
				key = res.getProfesseur().getNom() + "#"
						+ res.getProfesseur().getPrenom() + "#"
						+ res.getProfesseur().getSexe();
				key = key + "#" + res.getSeance().print() + "#"
						+ res.getSalle().print();

			}

			// on met ces String dans les fichiers
			writeReservation.print(key);

			writeReservation.close();

		}
	}

	/**
	 * Lance le chargement de la liste de réservation
	 * 
	 * Pour reconstituer les listes de données, il suffit de lire chaque ligne
	 * des fichiers, puis de récupérer chaque information en splitant la ligne.
	 * On peut alors reconstituer l'objet.
	 * 
	 * @return true si le chargement a réussi, false sinon
	 * @throws Exception
	 */
	public List<Reservation> chargerReservation() throws IOException {
		BufferedReader bufferReservation = null;

		try {
			bufferReservation = new BufferedReader(new FileReader(pathResTxt));

		} catch (Exception e) {
			System.out.println("probleme chargement texte");
			return null;
		}

		StringBuffer accumulateur = new StringBuffer("");

		// On lit chaque ligne du fichier des réservations
		try {
			while (bufferReservation.ready())
				accumulateur.append(bufferReservation.readLine()).append("\n");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String[] tab = accumulateur.toString().split("\n");
		String nom = "";
		// Pour chaque ligne, on splite les données séparés par '#'
		// On peut alors reconstituer la réservation, et l'ajouter à la liste

		for (int i = 0; i < tab.length; i++) {
			String[] tab2 = tab[i].split("#");
			if (tab2.length >= 17) {
				Professeur prof = new Professeur(tab2[0], tab2[1], tab2[2]
						.charAt(0));
				Enseignement ens = new Enseignement(tab2[3], new Professeur(
						tab2[4], tab2[5], tab2[6].charAt(0)), tab2[7], Integer
						.parseInt(tab2[8]));
				Seance sc = new Seance(ens, new Professeur(tab2[9], tab2[10],
						tab2[11].charAt(0)), stringToDate(tab2[12]), Integer
						.parseInt(tab2[13]), new Groupe(Integer
						.parseInt(tab2[15]), tab2[14]));
				Salle salle;

				if (tab2[14].equals("1"))
					salle = new SalleAmphi(Integer.parseInt(tab2[16]),
							tab2[17], Integer.parseInt(tab2[18]));
				else if (tab2[14].equals("2"))
					salle = new SalleCours(Integer.parseInt(tab2[16]),
							tab2[17], Integer.parseInt(tab2[18]));
				else if (tab2[14].equals("3"))
					salle = new SalleReunion(Integer.parseInt(tab2[16]),
							tab2[17], Integer.parseInt(tab2[18]));
				else if (tab2[14].equals("4"))
					salle = new SalleTd(Integer.parseInt(tab2[16]), tab2[17],
							Integer.parseInt(tab2[18]));
				else if (tab2[14].equals("5"))
					salle = new SalleTpFixe(Integer.parseInt(tab2[16]),
							tab2[17], Integer.parseInt(tab2[18]), Boolean
									.parseBoolean(tab2[19]), Boolean
									.parseBoolean(tab2[20]), tab2[21]);
				else if (tab2[14].equals("6"))
					salle = new SalleTpPortable(Integer.parseInt(tab2[16]),
							tab2[17], Integer.parseInt(tab2[18]), Boolean
									.parseBoolean(tab2[19]), Boolean
									.parseBoolean(tab2[20]));
				else
					salle = null;

				Reservation r = new Reservation(prof, salle, sc);
				reservation.add(r);
			}
		}

		return reservation;
	}

	@Override
	public void sauvegarder(Batiment batiment) throws IOException {

		// TODO Auto-generated method stub

	}

	@Override
	public Batiment chargerBatiment() throws IOException {
		// TODO Auto-generated method stub
		return null;
	}

	private Date stringToDate(String sDate) {
		Date d = null;
		try {
			SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
			ParsePosition pos = new ParsePosition(0);
			d = formatter.parse(sDate, pos);
		} catch (RuntimeException e) {
			e.printStackTrace();
		}
		return d;
	}

	@Override
	public Ecole chargerEcole() throws IOException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void sauvegarder(Ecole ecole) throws IOException {
		// TODO Auto-generated method stub

	}

}
